package types

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"time"
)

// MarshalJSON 序列化配置 时间格式
type LocalTime time.Time

func (t *LocalTime) MarshalJSON() ([]byte, error) {
	tTime := time.Time(*t)
	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}

// UnmarshalJSON 自定义时间格式解析
func (ct *LocalTime) UnmarshalJSON(data []byte) error {
	var t string
	if err := json.Unmarshal(data, &t); err != nil {
		return err
	}

	// 尝试多种时间格式
	layouts := []string{
		"2006-01-02",          // YYYY-MM-DD
		"2006-01-02 15:04:05", // YYYY-MM-DD HH:mm:SS
		time.RFC3339,          // ISO 8601
	}

	for _, layout := range layouts {
		parsedTime, err := time.Parse(layout, t)
		if err == nil {
			*ct = LocalTime(parsedTime)
			return nil
		}
	}

	return errors.New("invalid time format")
}

func (t LocalTime) Value() (driver.Value, error) {
	var zeroTime time.Time
	tlt := time.Time(t)
	//判断给定时间是否和默认零时间的时间戳相同
	if tlt.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return tlt, nil
}

func (t *LocalTime) Scan(v interface{}) error {
	if value, ok := v.(time.Time); ok {
		*t = LocalTime(value)
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)
}
